#ifndef EXCEPTIONS_H
#define EXCEPTIONS_H

#include <exception>

#include "pin.h"
#include "circuitelement.h"

using namespace std;

//Общий класс исключений
class GenericException : public std::exception
{
public:
    //Сообщение об ошибке
    QString message;

    GenericException();

    GenericException(QString message);

    ~GenericException() throw();

    const char* what();
};

//Исключение : сигнал принятный входным пином
class SignalException : public GenericException
{
private:
    //Контакт
    Pin *connector;

public:
    explicit SignalException(Pin *contact);

    //Пин вызвавший исключение
    Pin* getConnector();
};

//Исключение : неверное обращение к индексу в массиве
class ArrayIndexError : public GenericException
{
public:
    ArrayIndexError();
};

//Исключение : не найден выходной пин логического элемента
class OutputNotFound : public GenericException
{
private:
    CircuitElement* element;

public:
    OutputNotFound(CircuitElement* element);

    //Элемент вызвавший исключение
    const CircuitElement* getElement();
};

class LoadResourceException : public GenericException
{
public:
    LoadResourceException(const QString& filename);
};

#endif // EXCEPTIONS_H
